package cn.good.yan.service.t2;

import java.util.concurrent.*;

/**
 * 2. FutureTash 定义操作 - 异步任务
 * 1. Future  异步执行逻辑，如果没有执行完， 主线程（会一直阻塞，等待子线程执行完，它在执行），等待过程中使用自旋（等待，比较浪费CPU）
 *
 * @author shengren.yan
 * @create 2024-03-23
 */
public class FutureDemo2 {

    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        // 某线程执行 - 业务逻辑。。。
        FutureTask<String> futureTask = new FutureTask<String>(() -> {
            System.out.println(Thread.currentThread().getName() + "\t -----子线程- 任务正在执行");
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "该任务的返回值：task over：";
        });
        Thread t1 = new Thread(futureTask, "t1");
        t1.start();
        System.out.println(Thread.currentThread().getName() + "\t ----忙其它任务了");
        //System.out.println(futureTask.get());
        //System.out.println(futureTask.get(3,TimeUnit.SECONDS));
        // 自旋锁 （主线程 - 获取 子线程的返回值，子线程没有执行完，主线程会被阻塞）
        while (true) {
            if (futureTask.isDone()) {
                System.out.println(futureTask.get()); // 获取子线程的返回值，
                break;
            } else {
                //暂停毫秒
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("正在处理中，不要再催了");
            }
        }
        System.out.println(Thread.currentThread().getName() + "\t ----ok");
    }

}